//
//  AppNetwork.h
//  XiaoMiao
//
//  Created by 23 on 2017/11/5.
//  Copyright © 2017年 smallyou. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "AppError.h"


/**
 网络任务及其请求回调
 所有任务的基类
 */
typedef NSURLSessionTask AppURLSessionTask;
typedef void(^AppResponseSuccess)(id response); /** 请求成功的回调 */
typedef void(^AppResponseFail)(AppError *error); /** 请求失败的回调 */


/**
 上传或下载进度

 @param bytesCompleted 完成的字节数
 @param totalBytes 总共的字节数
 */
typedef void (^AppNetProgress)(int64_t bytesCompleted, int64_t totalBytes);


/**
 请求类型
 */
typedef NS_ENUM(NSUInteger, AppRequestType) {
    AppRequestTypeJSON       = 1,                       // 默认json
    AppRequestTypePlainText  = 2                        // 普通text/html
};


/**
 响应类型
 */
typedef NS_ENUM(NSUInteger, AppResponseType) {
    AppResponseTypeJSON = 1,                            // 默认json
    AppResponseTypeXML  = 2,                            // XML
    AppResponseTypeData = 3                             // 特殊情况下，一转换服务器就无法识别的，默认会尝试转换成JSON，若失败则需要自己去转换
};


/**
 网络状态
 */
typedef NS_ENUM(NSInteger, AppNetworkStatus) {
    AppNetworkStatusUnknown          = -1,              // 未知网络
    AppNetworkStatusNotReachable     = 0,               // 网络无连接
    AppNetworkStatusReachableViaWWAN = 1,               // 2，3，4G网络
    AppNetworkStatusReachableViaWiFi = 2,               // WIFI网络
};



@interface AppNetwork : NSObject


#pragma mark - 基础属性配置
/**
 更新基础网络请求URL

 @param baseUrl 基础URL
 */
+ (void)updateBaseUrl:(NSString *)baseUrl;


/**
 获取基础网络请求URL

 @return 基础URL
 */
+ (NSString *)baseUrl;


/**
 设置请求超时时间

 @param timeout 超时时间，默认是30秒
 */
+ (void)setTimeout:(NSTimeInterval)timeout;


/*
 开启或关闭接口打印信息
 
 @param isDebug 开发期，最好打开，默认是NO
 */
+ (void)enableInterfaceDebug:(BOOL)isDebug;


/**
 是否开启调试

 @return 是否开启
 */
+ (BOOL)isDebug;


/**
 配置请求格式，默认为JSON。如果要求传XML或者PLIST，请在全局配置一下
 
 @param requestType 请求格式，默认为JSON
 @param responseType 响应格式，默认为JSON，
 @param shouldCallbackOnCancelRequest 当取消请求时，是否要回调，默认为YES
 */
+ (void)configRequestType:(AppRequestType)requestType
             responseType:(AppResponseType)responseType
  callbackOnCancelRequest:(BOOL)shouldCallbackOnCancelRequest;


/**
 配置公共的请求头，只调用一次即可，通常放在应用启动的时候配置就可以了
 
 @param httpHeaders 只需要将与服务器商定的固定参数设置即可
 */
+ (void)configCommonHttpHeaders:(NSDictionary *)httpHeaders;



#pragma mark - 公共API
/**
 取消所有请求
 
 */
+ (void)cancelAllRequest;


/**
 取消某个请求
 如果是要取消某个请求，最好是引用接口所返回来的KLURLSessionTask对象，
 然后调用对象的cancel方法。如果不想引用对象，这里额外提供了一种方法来实现取消某个请求
 
 @param url				URL，可以是绝对URL，也可以是path（也就是不包括baseurl）
 */
+ (void)cancelRequestWithURL:(NSString *)url;



#pragma mark - GET请求接口
/**
 GET请求接口，若不指定baseurl，可传完整的url

 @param url          接口路径，如/path/getArticleList
 @param refreshCache 预留参数
 @param params       接口中所需要的拼接参数，如@{"categoryid" : @(12)}
 @param success      接口成功请求到数据的回调
 @param fail         接口请求数据失败的回调
 
 @return 返回的对象中有可取消请求的API
 */
+ (AppURLSessionTask *)getWithUrl:(NSString *)url refreshCache:(BOOL)refreshCache params:(NSDictionary *)params success:(AppResponseSuccess)success fail:(AppResponseFail)fail;



#pragma mark - POST请求接口
/**
 POST请求接口，若不指定baseurl，可传完整的url
 
 @param url      接口路径，如/path/getArticleList
 @refreshCache   是否从缓存拿
 @param params   接口中所需的参数，如@{"categoryid" : @(12)}
 @param success  接口成功请求到数据的回调
 @param fail     接口请求数据失败的回调
 
 @return 返回的对象中有可取消请求的API
 */
+ (AppURLSessionTask *)postWithUrl:(NSString *)url refreshCache:(BOOL)refreshCache params:(NSDictionary *)params success:(AppResponseSuccess)success fail:(AppResponseFail)fail;

/**
 POST请求接口，若不指定baseurl，可传完整的url
 
 @param url      接口路径，如/path/getArticleList
 @param params   接口中所需的参数，如@{"categoryid" : @(12)}
 @param success  接口成功请求到数据的回调
 @param fail     接口请求数据失败的回调
 
 @return 返回的对象中有可取消请求的API
 */
+ (AppURLSessionTask *)postWithUrl:(NSString *)url params:(NSDictionary *)params success:(AppResponseSuccess)success fail:(AppResponseFail)fail;


#pragma mark - 下载文件

/**
 下载文件
 
 @param url 服务器地址
 @param saveToPath 存储文件的地址
 @param progressBlock 下载进度
 @param success 成功回调
 @param failure 失败回调
 @return 下载任务
 */
+ (AppURLSessionTask *)downloadWithUrl:(NSString *)url saveToPath:(NSString *)saveToPath progress:(AppNetProgress)progressBlock success:(AppResponseSuccess)success failure:(AppResponseFail)failure;


#pragma mark - 文件上传

/**
 文件上传接口
 
 @param url 服务器地址
 @param uploadingFile 上传的文件路径
 @param progress 上传的进度
 @param success 成功回调
 @param fail 失败回调
 @return 上传任务
 */
+ (AppURLSessionTask *)uploadFileWithUrl:(NSString *)url uploadingFile:(NSString *)uploadingFile progress:(AppNetProgress)progress success:(AppResponseSuccess)success fail:(AppResponseFail)fail;

#pragma mark - 单张图片上传
/**
 单张图片上传
 
 @param image 图片
 @param url 上传服务器路径
 @param parameters 上传的参数
 @param progress 上传的进度
 @param success 成功的回调
 @param fail 失败的回调
 @return 上传任务
 */
+ (AppURLSessionTask *)uploadWithImage:(UIImage *)image url:(NSString *)url parameters:(NSDictionary *)parameters progress:(AppNetProgress)progress success:(AppResponseSuccess)success fail:(AppResponseFail)fail;


/**
 上传图片
 
 @param image 图片对象
 @param url 上传的服务器路径
 @param filename 文件名称
 @param name 图片名称
 @param mimeType 媒体的类型
 @param parameters 参数
 @param progress 上传机大怒
 @param success 成功回到
 @param fail 失败回调
 @return 上传任务
 */
+ (AppURLSessionTask *)uploadWithImage:(UIImage *)image url:(NSString *)url filename:(NSString *)filename name:(NSString *)name mimeType:(NSString *)mimeType parameters:(NSDictionary *)parameters progress:(AppNetProgress)progress success:(AppResponseSuccess)success fail:(AppResponseFail)fail;



#pragma mark - 多张图片上传

/**
 上传多想图片
 
 @param imageArray 图片对象数组
 @param url 上传的服务器url
 @param params 参数
 @param complete 回调
 */
+ (void)uploadWithImageArray:(NSArray <UIImage *>*)imageArray url:(NSString *)url params:(NSDictionary *)params complete:(void(^)(NSMutableArray <id>*successResponses, NSMutableArray <UIImage *>*successImages))complete;

@end




















